La reutilización de software consiste en producir software como si se tratara de componentes eléctricos, para posteriormente utilizarlos sin tener que rediseñarlos de nuevo.
Los objetivos de la reutilización del software son:
Reducir el tiempo de desarrollo.
Reducir costos de desarrollo y mantenimiento.
Aumentar la calidad del producto.
Enfoques de la reutilización:
| Reutilización ocasional | Aprovecha los recursos disponibles cuando son necesarios (pensando en el ahora). |
| Reuse driven develpment | Desarrollo orientado a la reutilización: Los elementos se diseñan e implementan pensando en su reutilización a largo plazo (pensando en el futuro). |
Ciclo del desarrollo orientado a la reutilización (Reuse Driven Development):
Establecer los requisitos del sistema.
Buscar componentes reutilizables.
Adaptar los requisitos a los componentes.
Diseñar los componentes que faltan con vistas a su reutilización.
Desarrollar los módulos de interconexión de componentes.
Implementar el sistema.

Son un conjunto de funciones reutilizables que disponen de una interface bien definida para su funcionalidad.
Una librería no está diseñada para ser utilizada de forma independiente.
Un componente es un fragmento reemplazable de un sistema que encapsula su funcionalidad y la ofrecen al exterior a través de una interface.
Son unidades de software independientes que se combinan con otras para crear un sistema.
Cualquier componente tiene en general dos interfaces relacionadas:
Interface requiere: dependencias de otros componentes.
Interface proporciona: servicios ofrecidos.

Permiten reutilizar diseños anteriores, las clases que otros han desarrollado y modificar el código para adaptarlo a nuestras necesidades.
Conceptos de la POO que favorecen la reutilización:
Abstracción: consiste en aislar una propiedad o función concreta de un objeto.
Ejemplo: tenemos la clase "Puerta". Una abstracción seria la función "abrir( )".
Encapsulamiento: El objeto contiene estado (atributos) y comportamiento (métodos).
Herencia: Jerarquias de clases que permiten heredar atributos y métodos.
Polimorfismo: permite trabajar con diferentes objetos sin importar su tipo concreto.
Un patrón de diseño es una solución a un problema que se ha presentado en múltiples ocasiones y nos sirve de base para buscar soluciones a problemas de desarrollo del software.
Un patrón contiene una solución probada a un problema en un determinado contexto.
Para que una solución sea considerada patrón:
Debe haber sido aplicada y probada.
La descripción ha de ser suficientemente genérica.
Los frameworks ofrecen un conjunto de clases, concretas y abstractas, así como interfaces que ayudan a la resolución de problemas frecuentes y que, además guían al desarrollador en el diseño arquitectónico del sistema.
Las principales diferencias entre los patrones de diseño y los frameworks son:
Los patrones son más abtractos.
Los patrones son elementos arquitecturales más pequeños.
Los patrones son menos especializados.
El diseño de la arquitectura de un sistema es una representación de su estructura general al más alto nivel.
Los diseños arquitectónicos:
Permiten identificar relaciones entre diferentes subsistemas.
Permiten la reutilización de elementos existentes.
Permiten documentar el sistema de manera gráfica.
Generan patrones para problemas habituales.
J2EE es una arquitectura que facilita el desarrollo de aplicaciones completas, proporcionando independencia de la plataforma, portabilidad e interoperabilidad entre aplicaciones.
Se basa en una arquitectura compuesta por capas:
Capa cliente.
Capa WEB.
Capa de negocio.
Capa de datos.

Sus principales objetivos son:
Abstracción de tareas críticas y repetitivas.
Preparación de una infraestructura uniforme.
Ventajas:
Reducir el tiempo de desarrollo.
Reducir los costes de mantenimiento.
Aumentar la eficiencia.
Aumentar la consistencia.
Mejorar la arquitectura.
Aumentar la legibilidad del código.
Inconvenientes:
Costes de desarrollo más elevados.
Los componentes genéricos pueden ser menos eficientes.
Inversión inicial elevada.
Costes de aprendizaje e integración.